package javase.CollectionAndMap.generic;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 泛型的通配符 <?>
 * 1.上边界
 * <? extends E> 传入的类型要么是E类型，要么是E的子类类型
 *
 * 2.下边界
 * <? super E>  传入的类型要么是E类型，要么是E的父类类型
 */
public class GenericDemo4<E> {

    //上边界  E Number类型 ->  Number 、 Integer  、 Object(X)
    public void dosth1(Collection<? extends E> c , E e){
        //无法添加元素
        //c.add(e);

        for (E ee : c) {
            System.out.println(ee);
        }
    }

    //下边界  E Number类型 ->  Number 、 Integer(X)  、 Object
    public void dosth2(Collection<? super E> c , E e){
        //允许添加元素
        c.add(e);

        for (Object o : c) {
            System.out.println(o);
        }
    }


    public static void main(String[] args) {
        GenericDemo4<Number> gen = new GenericDemo4<>();

        List<Number> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        List<Object> list3 = new ArrayList<>();

        //上边界  E Number类型 ->  Number 、 Integer  、 Object(X)
        gen.dosth1(list1 , 10);
        gen.dosth1(list2 , 10);
        //gen.dosth1(list3 , 10);


        //下边界  E Number类型 ->  Number 、 Integer(X)  、 Object
        gen.dosth2(list1 , 20);
        //gen.dosth2(list2 , 20);
        gen.dosth2(list3 , 20);
    }

}
